

let callback = []
let pending = false;

function flush () {
  callback.forEach(cb => cb());
  pending = false
}

let timerFunc;
// 处理兼容问题
if (Promise) {
  // ES6 支持的语法
  timerFunc = () => {
    // 异步处理
    Promise.resolve().then(flush)
  }
} else if (MutationObserver) {
  // h5 处理异步的方法，可以监听DOM的变化，监控完毕之后再进行异步更新
  let observe = new MutationObserver(flush)
  // 创建文本
  let textNode = document.createTextNode(1)
  // 观测文本的内容
  observe.observe(textNode, {characterData: true});
  timerFunc = () => {
    textNode.textContent = 2
  }
} else if (setImmediate) {
  // ie 支持的异步方法
  timerFunc = () => {
    setImmediate(flush)
  }
}

export function nextTick (cb) {
  // console.log('cb===', cb)
  // 列队[cb1, cb2]
  callback.push(cb)

  // vue3中就是使用promise.then() 来处理异步
  if (!pending) {
    // 异步执行方法，需要处理兼容问题
    timerFunc()
    pending = true;
  }
}